package config

import (
    "time"

    "bird/pkg/env"

    "github.com/fsnotify/fsnotify"
    "github.com/spf13/viper"
)

var config = new(Config)

type Config struct {
    MySQL struct {
        Read struct {
            Addr string `toml:"addr"`
            User string `toml:"user"`
            Pass string `toml:"pass"`
            Name string `toml:"name"`
        } `toml:"read"`
        Write struct {
            Addr string `toml:"addr"`
            User string `toml:"user"`
            Pass string `toml:"pass"`
            Name string `toml:"name"`
        } `toml:"write"`
        Base struct {
            MaxOpenConn     int           `toml:"maxOpenConn"`
            MaxIdleConn     int           `toml:"maxIdleConn"`
            ConnMaxLifeTime time.Duration `toml:"connMaxLifeTime"`
        } `toml:"base"`
    } `toml:"mysql"`

    Redis struct {
        Addr         string `toml:"addr"`
        Pass         string `toml:"pass"`
        Db           int    `toml:"db"`
        MaxRetries   int    `toml:"maxRetries"`
        PoolSize     int    `toml:"poolSize"`
        MinIdleConns int    `toml:"minIdleConns"`
    } `toml:"redis"`

    Mail struct {
        Host string `toml:"host"`
        Port int    `toml:"port"`
        User string `toml:"user"`
        Pass string `toml:"pass"`
        To   string `toml:"to"`
    } `toml:"mail"`

    JWT struct {
        Secret          string        `toml:"secret"`
        ExpireDuration  time.Duration `toml:"expireDuration"`
        RefreshDuration time.Duration `toml:"refreshDuration"`
    } `toml:"jwt"`

    URLToken struct {
        Secret         string        `toml:"secret"`
        ExpireDuration time.Duration `toml:"expireDuration"`
    } `toml:"urlToken"`

    HashIds struct {
        Secret string `toml:"secret"`
        Length int    `toml:"length"`
    } `toml:"hashids"`

    Language struct {
        Local string `toml:"local"`
    } `toml:"language"`

    Sms struct {
        SecretId  string `toml:"secretId"`
        SecretKey string `toml:"secretKey"`
        SdkAppId  string `toml:"sdkAppId"`
        SignName  string `toml:"signName"`
    } `toml:"sms"`
}

func init() {
    viper.SetConfigName(env.Active().Value() + "_configs")
    viper.SetConfigType("toml")
    viper.AddConfigPath("./config")

    if err := viper.ReadInConfig(); err != nil {
        panic(err)
    }

    if err := viper.Unmarshal(config); err != nil {
        panic(err)
    }

    viper.WatchConfig()
    viper.OnConfigChange(func(e fsnotify.Event) {
        if err := viper.Unmarshal(config); err != nil {
            panic(err)
        }
    })
}

func Get() Config {
    return *config
}
